#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include "mvdef.h"
/* 定义ioctl命令 */
#define MOTOR_START _IO('M', 0)
#define MOTOR_STOP  _IO('M', 1)
#define SET_SPEED_LOW _IO('M', 2)
#define SET_SPEED_HIGH _IO('M', 3)
#define SET_DIRECTION _IO('M', 4)

/**
 * @brief 电机控制主函数，提供用户交互界面，通过ioctl控制电机的启动、停止、调速和方向设置
 * @param 无
 * @return MV_EC_SUCCESS（0）：操作成功
 *         MV_EC_FAILED（-1）：打开设备文件或ioctl操作失败
 * @note  用户需根据提示输入对应数字进行操作，输入5可安全退出程序
 */
mv_s32_t main() {
    mv_s32_t _s32_fd;
    _s32_fd = open("/dev/motor_device", O_RDWR);
    if (_s32_fd < 0) {
        perror("Failed to open device file");
        return MV_EC_FAILED;
    }

    mv_s32_t _s32_input;
    mv_bool_t _b_running = MV_TRUE;
    
    while(_b_running) { 
        printf("请输入选项启动电机按0，停止电机按1，设置低速按2，设置高速按3,反转按4，退出调试按5：");
        scanf("%d", &_s32_input);
        
        mv_s32_t ret = MV_EC_SUCCESS;
        
        switch(_s32_input) {
            case 0:
                ret = ioctl(_s32_fd, MOTOR_START);
                break;
            case 1:
                ret = ioctl(_s32_fd, MOTOR_STOP);
                break;
            case 2:
                ret = ioctl(_s32_fd, SET_SPEED_LOW);
                break;
            case 3:
                ret = ioctl(_s32_fd, SET_SPEED_HIGH);
                break;
            case 4:
                ret = ioctl(_s32_fd, SET_DIRECTION);
                break;
            case 5:
                ret = ioctl(_s32_fd, MOTOR_STOP);
                _b_running = MV_FALSE;
                break;
            default:
                printf("无效的输入选项\n");
                continue; /* 跳过本次while循环，进入下一次循环 */
        }
        
        if (ret < 0) {
            perror("ioctl operation failed");
            close(_s32_fd);
            return MV_EC_FAILED;
        }
    }

    /* 关闭设备文件 */
    close(_s32_fd);
    return MV_EC_SUCCESS;
}